import java.util.HashMap;
import java.util.Map;

class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}





public class Test_9_17 {

    //力扣：138. 复制带随机指针的链表
    public Node copyRandomList(Node head) {
        if(head == null) return null;

        Map<Node, Node> map = new HashMap<>();
        Node cur = head;
        while(cur != null) {
            Node node = new Node(cur.val);
            map.put(cur, node);
            cur = cur.next;
        }
        for(cur = head; cur != null; cur = cur.next) {
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
        }
        return map.get(head);
    }




    //力扣：219. 存在重复元素 II
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        //map中 存储的是 该数字 与 其下标
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++) {
            //如果map 存在关键字Key nums[i], 计算其value 与 i 的差值
            if(map.containsKey(nums[i])) {
                int index = map.get(nums[i]);
                if(i - index <= k) {
                    return true;
                } else {
                    map.put(nums[i], i);
                }
                // map 不存在关键字 nums[i]， 则存入 nums[i]及其下标
            } else {
                map.put(nums[i], i);
            }
        }

        return false;
    }
}
